11️⃣ Introducción

Este análisis tiene como objetivo calcular probabilidades condicionales en el dataset de IMDb, respondiendo preguntas como:

Estos cálculos permiten entender patrones en la industria del cine y su relación con el presupuesto, la recaudación y las calificaciones.

2️⃣ Carga de Librerías y Configuración

install.packages("here",dependencies = TRUE)
library(here)           # Manejo de rutas dinámicas
source(here("reportes/Proy_Imdb/00_CONFIGURACION.r"))
# 📌 Cargar librerías necesarias
library(janitor)        # Limpieza de nombres de columnas
library(summarytools)   # Resumen estadístico detallado
library(ggplot2)        # Gráficos
library(dplyr)          # Manipulación de datos
library(plotly)         # Gráficos Interactivos

# 📌 Configuración de gráficos globales
theme_set(theme_minimal())

# 📌 Cargar scripts de preprocesamiento
source(here("scripts/utils.r"))
source(here("scripts/1_preprocesamiento_esp_dataset.r"))
source(here("scripts/3_analisis_probabilidad.r"))

3️⃣ Carga y Preprocesamiento de Datos

📌 ¿Qué hace esta función?

✔ Limpia los nombres de las columnas.

✔ Convierte variables categóricas en factores.

✔ Filtra valores inválidos.

✔ Retorna un dataset listo para análisis.

# 📌 Cargar y preprocesar el dataset IMDb
imdb_data <- preprocesar_datos(here("datasets/imdb_data_limpio.csv"), "Imdb")
## 📥 Cargando datos del proyecto: Imdb 
## 🧹 Realizando limpieza de datos...
## 📊 Aplicando preprocesamiento específico para IMDb...
## ✅ Preprocesamiento completado para: Imdb
# Filtrar géneros con más de 50 películas
imdb_filtered <- imdb_data %>%
  group_by(genre) %>%
  filter(n() > 50) %>%
  ungroup()

4️⃣ Cálculo de Probabilidades Condicionales

En esta sección analizamos la relación entre presupuesto, recaudación, género y calificación de películas aplicando cálculos de probabilidad condicional.

📌 Probabilidad de que una película con alto presupuesto tenga alta recaudación

# 📌 Definir los bins para cada variable
bins_budget <- seq(0, max(imdb_filtered$budget_x, na.rm = TRUE), by = 50000000)  # Intervalos de $50M
bins_revenue <- seq(0, max(imdb_filtered$revenue, na.rm = TRUE), by = 100000000)  # Intervalos de $100M

# 📌 Transformar los datos antes de calcular probabilidades
imdb_data_binned <- imdb_filtered %>%
  filter(budget_x > 0, revenue > 0) %>%  # Eliminamos valores nulos
  mutate(
    budget_x = cut(budget_x, breaks = bins_budget, include.lowest = TRUE),
    revenue = cut(revenue, breaks = bins_revenue, include.lowest = TRUE)
  )

# 📌 Calcular la probabilidad condicional de recaudación dado el presupuesto
resultados_budget_vs_revenue <- calcular_probabilidades(
  data = imdb_data_binned,
  condicionante = "budget_x",
  objetivo = "revenue"
)

# 📌 Mostrar resultados
cat("Tabla de contingencia:\n")
## Tabla de contingencia:
print(resultados_budget_vs_revenue$tabla_contingencia)
## # A tibble: 55 × 3
##    budget_x      revenue           n
##    <fct>         <fct>         <int>
##  1 [0,5e+07]     [0,1e+08]      1475
##  2 [0,5e+07]     (1e+08,2e+08]   233
##  3 [0,5e+07]     (2e+08,3e+08]    90
##  4 [0,5e+07]     (3e+08,4e+08]    44
##  5 [0,5e+07]     (4e+08,5e+08]    16
##  6 [0,5e+07]     (5e+08,6e+08]     7
##  7 [0,5e+07]     (6e+08,7e+08]     8
##  8 [0,5e+07]     (7e+08,8e+08]     1
##  9 (5e+07,1e+08] [0,1e+08]        69
## 10 (5e+07,1e+08] (1e+08,2e+08]    76
## # ℹ 45 more rows
cat("\nProbabilidades condicionales:\n")
## 
## Probabilidades condicionales:
print(resultados_budget_vs_revenue$probabilidades_condicionales)
## # A tibble: 55 × 4
##    budget_x      revenue           n prob_condicional
##    <fct>         <fct>         <int>            <dbl>
##  1 [0,5e+07]     [0,1e+08]      1475         0.787   
##  2 [0,5e+07]     (1e+08,2e+08]   233         0.124   
##  3 [0,5e+07]     (2e+08,3e+08]    90         0.0480  
##  4 [0,5e+07]     (3e+08,4e+08]    44         0.0235  
##  5 [0,5e+07]     (4e+08,5e+08]    16         0.00854 
##  6 [0,5e+07]     (5e+08,6e+08]     7         0.00374 
##  7 [0,5e+07]     (6e+08,7e+08]     8         0.00427 
##  8 [0,5e+07]     (7e+08,8e+08]     1         0.000534
##  9 (5e+07,1e+08] [0,1e+08]        69         0.0844  
## 10 (5e+07,1e+08] (1e+08,2e+08]    76         0.0929  
## # ℹ 45 more rows
cat("\nProbabilidades marginales de recaudación:\n")
## 
## Probabilidades marginales de recaudación:
print(resultados_budget_vs_revenue$probabilidades_marginales)
## # A tibble: 18 × 3
##    revenue               n prob_marginal
##    <fct>             <int>         <dbl>
##  1 [0,1e+08]          1575      0.444   
##  2 (1e+08,2e+08]       440      0.124   
##  3 (2e+08,3e+08]       303      0.0854  
##  4 (3e+08,4e+08]       362      0.102   
##  5 (4e+08,5e+08]       273      0.0769  
##  6 (5e+08,6e+08]       233      0.0657  
##  7 (6e+08,7e+08]       176      0.0496  
##  8 (7e+08,8e+08]        78      0.0220  
##  9 (8e+08,9e+08]        50      0.0141  
## 10 (9e+08,1e+09]        31      0.00874 
## 11 (1e+09,1.1e+09]       8      0.00225 
## 12 (1.1e+09,1.2e+09]     3      0.000846
## 13 (1.2e+09,1.3e+09]     3      0.000846
## 14 (1.3e+09,1.4e+09]     1      0.000282
## 15 (1.5e+09,1.6e+09]     8      0.00225 
## 16 (1.6e+09,1.7e+09]     1      0.000282
## 17 (1.7e+09,1.8e+09]     1      0.000282
## 18 <NA>                  2      0.000564

📌 Probabilidad de que una película de cierto género tenga calificación alta

# Calcular probabilidades
resultados_genre_vs_score <- calcular_probabilidades(
  data = imdb_filtered,
  condicionante = "genre",
  objetivo = "score",
  bins = 10  # Dividimos la calificación en 5 grupos
)

# 📌 Mostrar resultados
cat("Tabla de contingencia:\n")
## Tabla de contingencia:
print(resultados_genre_vs_score$tabla_contingencia)
## # A tibble: 185 × 3
##    genre          score         n
##    <fct>          <fct>     <int>
##  1 Action         [-0.1,10]     1
##  2 Action         (20,30]       1
##  3 Action         (30,40]       1
##  4 Action         (40,50]       3
##  5 Action         (50,60]      35
##  6 Action         (60,70]      40
##  7 Action         (70,80]       5
##  8 Action, Comedy [-0.1,10]     1
##  9 Action, Comedy (30,40]       1
## 10 Action, Comedy (40,50]       3
## # ℹ 175 more rows
cat("\nProbabilidades condicionales:\n")
## 
## Probabilidades condicionales:
print(resultados_genre_vs_score$probabilidades_condicionales)
## # A tibble: 185 × 4
##    genre          score         n prob_condicional
##    <fct>          <fct>     <int>            <dbl>
##  1 Action         [-0.1,10]     1           0.0116
##  2 Action         (20,30]       1           0.0116
##  3 Action         (30,40]       1           0.0116
##  4 Action         (40,50]       3           0.0349
##  5 Action         (50,60]      35           0.407 
##  6 Action         (60,70]      40           0.465 
##  7 Action         (70,80]       5           0.0581
##  8 Action, Comedy [-0.1,10]     1           0.0182
##  9 Action, Comedy (30,40]       1           0.0182
## 10 Action, Comedy (40,50]       3           0.0545
## # ℹ 175 more rows
cat("\nProbabilidades marginales de score:\n")
## 
## Probabilidades marginales de score:
print(resultados_genre_vs_score$probabilidades_marginales)
## # A tibble: 10 × 3
##    score         n prob_marginal
##    <fct>     <int>         <dbl>
##  1 [-0.1,10]   124       0.0348 
##  2 (10,20]      25       0.00701
##  3 (20,30]      22       0.00617
##  4 (30,40]      54       0.0151 
##  5 (40,50]     225       0.0631 
##  6 (50,60]     859       0.241  
##  7 (60,70]    1361       0.382  
##  8 (70,80]     799       0.224  
##  9 (80,90]      89       0.0250 
## 10 (90,100]      9       0.00252

📌 Probabilidad de que una película de cierto país tenga un alto presupuesto

# Filtrar los 5 países con más películas en la base de datos
top_countries <- imdb_filtered %>%
  count(country, sort = TRUE) %>%
  top_n(5) %>%
  pull(country)

# Filtrar dataset con los países seleccionados
imdb_filtered_country <- imdb_filtered %>%
  filter(country %in% top_countries)

# Calcular probabilidades
resultados_country_vs_budget <- calcular_probabilidades(
  data = imdb_filtered_country,
  condicionante = "country",
  objetivo = "budget_x",
  bins = 5
)

# 📌 Mostrar resultados
cat("Tabla de contingencia:\n")
## Tabla de contingencia:
print(resultados_country_vs_budget$tabla_contingencia)
## # A tibble: 20 × 3
##    country budget_x                n
##    <fct>   <fct>               <int>
##  1 AU      [-3.4e+05,6.8e+07]   1163
##  2 AU      (6.8e+07,1.36e+08]    222
##  3 AU      (1.36e+08,2.04e+08]    37
##  4 AU      (2.04e+08,2.72e+08]     4
##  5 ES      [-3.4e+05,6.8e+07]     32
##  6 ES      (6.8e+07,1.36e+08]     52
##  7 ES      (1.36e+08,2.04e+08]     6
##  8 ES      (2.04e+08,2.72e+08]     3
##  9 FR      [-3.4e+05,6.8e+07]     45
## 10 FR      (6.8e+07,1.36e+08]     51
## 11 FR      (1.36e+08,2.04e+08]    11
## 12 FR      (2.04e+08,2.72e+08]     1
## 13 KR      [-3.4e+05,6.8e+07]     60
## 14 KR      (6.8e+07,1.36e+08]    105
## 15 KR      (1.36e+08,2.04e+08]    79
## 16 US      [-3.4e+05,6.8e+07]    598
## 17 US      (6.8e+07,1.36e+08]    348
## 18 US      (1.36e+08,2.04e+08]    81
## 19 US      (2.04e+08,2.72e+08]    12
## 20 US      (2.72e+08,3.4e+08]      1
cat("\nProbabilidades condicionales:\n")
## 
## Probabilidades condicionales:
print(resultados_country_vs_budget$probabilidades_condicionales)
## # A tibble: 20 × 4
##    country budget_x                n prob_condicional
##    <fct>   <fct>               <int>            <dbl>
##  1 AU      [-3.4e+05,6.8e+07]   1163         0.816   
##  2 AU      (6.8e+07,1.36e+08]    222         0.156   
##  3 AU      (1.36e+08,2.04e+08]    37         0.0259  
##  4 AU      (2.04e+08,2.72e+08]     4         0.00281 
##  5 ES      [-3.4e+05,6.8e+07]     32         0.344   
##  6 ES      (6.8e+07,1.36e+08]     52         0.559   
##  7 ES      (1.36e+08,2.04e+08]     6         0.0645  
##  8 ES      (2.04e+08,2.72e+08]     3         0.0323  
##  9 FR      [-3.4e+05,6.8e+07]     45         0.417   
## 10 FR      (6.8e+07,1.36e+08]     51         0.472   
## 11 FR      (1.36e+08,2.04e+08]    11         0.102   
## 12 FR      (2.04e+08,2.72e+08]     1         0.00926 
## 13 KR      [-3.4e+05,6.8e+07]     60         0.246   
## 14 KR      (6.8e+07,1.36e+08]    105         0.430   
## 15 KR      (1.36e+08,2.04e+08]    79         0.324   
## 16 US      [-3.4e+05,6.8e+07]    598         0.575   
## 17 US      (6.8e+07,1.36e+08]    348         0.335   
## 18 US      (1.36e+08,2.04e+08]    81         0.0779  
## 19 US      (2.04e+08,2.72e+08]    12         0.0115  
## 20 US      (2.72e+08,3.4e+08]      1         0.000962
cat("\nProbabilidades marginales de presupuesto:\n")
## 
## Probabilidades marginales de presupuesto:
print(resultados_country_vs_budget$probabilidades_marginales)
## # A tibble: 5 × 3
##   budget_x                n prob_marginal
##   <fct>               <int>         <dbl>
## 1 [-3.4e+05,6.8e+07]   1898      0.652   
## 2 (6.8e+07,1.36e+08]    778      0.267   
## 3 (1.36e+08,2.04e+08]   214      0.0735  
## 4 (2.04e+08,2.72e+08]    20      0.00687 
## 5 (2.72e+08,3.4e+08]      1      0.000344

📊 Visualización de Resultados

📊 Probabilidad de Recaudación según Presupuesto

p_budget_vs_revenue <- visualizar_probabilidad_condicional(
  data = imdb_data_binned,
  condicionante = "budget_x",
  objetivo = "revenue",
  titulo = "Probabilidad de Recaudación según Presupuesto en IMDb",
  xlab = "Presupuesto (USD)",
  guardar = TRUE,
  ruta_guardado = here("reportes/Proy_Imdb/resultados_generados/probabilidad_condicional_budget_vs_revenue.png"),
  bins = bins_budget
) 

p_budget_vs_revenue <- p_budget_vs_revenue %>% 
  layout(xaxis = list(tickangle = 90))  # Rotar etiquetas del eje X a 90 grados

# Mostrar el gráfico con etiquetas rotadas
p_budget_vs_revenue

📊 Probabilidad de Género según Calificación

# Filtrar géneros con al menos 50 películas
filtered_genres <- imdb_filtered %>%
  group_by(genre) %>%
  filter(n() > 250) %>%
  ungroup()

# Generar el gráfico con los géneros filtrados
p_genre_vs_score <- visualizar_probabilidad_condicional(
  data = filtered_genres,
  condicionante = "genre",
  objetivo = "score",
  titulo = "Probabilidad de Género según Calificación en IMDb",
  xlab = "Género",
  guardar = TRUE,
  ruta_guardado = here("reportes/Proy_Imdb/resultados_generados/probabilidad_condicional_genre_vs_score.png"),
  bins=10
) %>% layout(xaxis = list(tickangle = 90))  # Aplicar la rotación

# Mostrar el gráfico corregido
p_genre_vs_score

📊 Probabilidad de Presupuesto según País

p_country_vs_budget <- visualizar_probabilidad_condicional(
  data = imdb_filtered_country,
  condicionante = "country",
  objetivo = "budget_x",
  titulo = "Probabilidad de Presupuesto según País en IMDb",
  xlab = "País",
  guardar = TRUE,
  ruta_guardado = here("reportes/Proy_Imdb/resultados_generados/probabilidad_condicional_country_vs_budget.png"),
  bins=10
)

p_country_vs_budget